#ifndef OPERATION_LOG_H
#define OPERATION_LOG_H

#include "baselog.h"

/**
 * @brief 操作日志类
 *
 * 继承自日志基类BaseLog，专门用于记录用户在系统中的具体操作行为，
 * 在基类基础上扩展了操作模块和操作内容属性，适用于用户行为审计和系统操作跟踪，
 * 支持Qt元对象系统和QML界面绑定。
 */
class OperationLog : public BaseLog
{
    Q_OBJECT

    /**
     * @brief 操作模块
     * 记录操作所属的系统模块（如"库存管理"、"用户管理"），支持QML绑定
     */
    Q_PROPERTY(QString module READ get_module WRITE set_module NOTIFY module_changed)

    /**
     * @brief 操作内容
     * 记录具体的操作详情（如"新增物料ID:1001"、"修改库存数量"），支持QML绑定
     */
    Q_PROPERTY(QString content READ get_content WRITE set_content NOTIFY content_changed)

public:
    /**
     * @brief 无参构造函数
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit OperationLog(QObject *parent = nullptr)
        : BaseLog(parent) {}

    /**
     * @brief 带参构造函数
     * @param oper_user 操作人名称（继承自基类）
     * @param oper_time 操作时间字符串（继承自基类）
     * @param oper_result 操作结果描述（继承自基类，如"成功"、"部分成功"）
     * @param module 操作所属模块
     * @param content 具体操作内容详情
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit OperationLog(const QString& oper_user, const QString& oper_time, const QString& oper_result,
                          const QString& module, const QString& content, QObject *parent = nullptr)
        : BaseLog(oper_user, oper_time, oper_result, parent),
          m_module(module), m_content(content) {}

    // -------------------------- 特有属性Getter方法 --------------------------

    /**
     * @brief 获取操作模块
     * @return 操作所属的系统模块名称
     */
    QString get_module() const { return m_module; }

    /**
     * @brief 获取操作内容
     * @return 具体的操作详情描述
     */
    QString get_content() const { return m_content; }

    // -------------------------- 特有属性Setter方法 --------------------------

    /**
     * @brief 设置操作模块
     * @param new_module 新的操作模块名称
     * @note 当新值与旧值不同时，会发射module_changed信号
     */
    void set_module(const QString& new_module) {
        if (m_module != new_module) {
            m_module = new_module;
            emit module_changed(new_module);
        }
    }

    /**
     * @brief 设置操作内容
     * @param new_content 新的操作内容详情
     * @note 当新值与旧值不同时，会发射content_changed信号
     */
    void set_content(const QString& new_content) {
        if (m_content != new_content) {
            m_content = new_content;
            emit content_changed(new_content);
        }
    }

signals:
    /**
     * @brief 操作模块变更信号
     * @param new_module 变更后的操作模块名称
     */
    void module_changed(const QString& new_module);

    /**
     * @brief 操作内容变更信号
     * @param new_content 变更后的操作内容详情
     */
    void content_changed(const QString& new_content);

private:
    QString m_module;  // 操作模块（如"库存管理"、"物料管理"）
    QString m_content; // 操作内容详情（如"删除货架ID:5的记录"）
};

#endif // OPERATION_LOG_H
